Backdrop

프로그래머스 ▸ 코딩 기초 트레이닝

대소문자 바꿔서 출력하기
0

문제 설명

영어 알파벳으로 이루어진 문자열 str이 주어집니다. 각 알파벳을 대문자는 소문자로 소문자는 대문자로 변환해서 출력하는 코드를 작성해 보세요.

제한사항

  • 1 ≤ str의 길이 ≤ 20
    • str은 알파벳으로 이루어진 문자열입니다.

입출력 예

입력 #1

aBcDeFg

출력 #1

AbCdEfG

풀이

이론

대문자와 소문자 변환

  • toUpperCase(): 대문자로 변환
  • toLowerCase(): 소문자로 변환
const readline = require('readline');
const rl = readline.createInterface({
  input: process.stdin,
  output: process.stdout,
});
 
let input = [];
 
rl.on('line', function (line) {
  input = [line];
}).on('close', function () {
  const str = input[0];
  output = [...str].reduce((acc, cur) => {
    if (cur === cur.toUpperCase()) {
      acc += cur.toLowerCase();
    } else {
      acc += cur.toUpperCase();
    }
    return acc;
  }, '');
 
  console.log(output);
});

reduce()를 사용해서 풀었어요. [...str]을 통해 문자열을 배열로 만들고, reduce()를 통해 각 문자를 순회하면서 대문자인지 소문자인지 확인하고, 그에 맞게 변환해주었어요.

전개 구문 (Spread Syntax)

전개 구문 ...을 사용해서 배열이나 문자열을 개별 요소로 분리할 수 있어요. 배열에 있는 요소를 배열 밖으로 꺼내어 사용할 때 유용하게 사용할 수 있어요.

const str = 'hello';
console.log([...str]); // ['h', 'e', 'l', 'l', 'o']

Array.prototype.reduce()

배열의 각 요소에 대해 주어진 리듀서(reducer) 함수를 실행하고, 하나의 결과값을 반환해요.

arr.reduce(callback[, initialValue]);

callback 함수는 네 개의 인자를 가져요.

  • accumulator (acc, prev) : 콜백의 반환값을 누적
  • currentValue (cur, curr) : 처리할 현재 요소
  • currentIndex (idx, index) : 처리할 현재 요소의 인덱스 (optional)
  • array (src) : reduce()를 호출한 배열 (optional)

initialValue를 제공한 경우, accinitialValue와 같고, cur는 배열의 첫 번째 요소와 같아요.

initialValue를 제공하지 않은 경우, acc는 배열의 첫 번째 요소와 같고, cur는 두 번째 요소와 같아요.

const arr = [1, 2, 3, 4, 5];
const sum = arr.reduce((prev, curr) => prev + curr, 0);
console.log(sum); // 15

map vs reduce

map()은 반환값이 같은 길이의 배열이고, reduce()는 반환값이 무엇이든 상관없어요. 주어진 조건에 따라 map()reduce() 또는 다른 메서드를 사용해야 해요.

코드

const readline = require('readline');
const rl = readline.createInterface({
  input: process.stdin,
  output: process.stdout,
});
 
let input = [];
 
rl.on('line', function (line) {
  input = [line];
}).on('close', function () {
  const str = input[0];
  output = [...str].reduce((acc, cur) => {
    if (cur === cur.toUpperCase()) {
      acc += cur.toLowerCase();
    } else {
      acc += cur.toUpperCase();
    }
    return acc;
  }, '');
 
  console.log(output);
});